import { defineStore } from 'pinia'
import { login as userLogin, logout as userLogout, getUserInfo } from '@/api/user'
import { setToken, clearToken } from '@/utils/auth'
import { removeRouteListener } from '@/utils/route-listener'
import useAppStore from '../app'

const useUserStore = defineStore('user', {
	state: () => ({
		name: undefined,
		avatar: undefined,
		job: undefined,
		organization: undefined,
		location: undefined,
		email: undefined,
		introduction: undefined,
		personalWebsite: undefined,
		jobName: undefined,
		organizationName: undefined,
		locationName: undefined,
		phone: undefined,
		registrationDate: undefined,
		accountId: undefined,
		certification: undefined,
		role: '',
	}),

	getters: {
		userInfo(state) {
			return { ...state }
		},
	},

	actions: {
		switchRoles() {
			return new Promise((resolve) => {
				this.role = this.role === 'user' ? 'admin' : 'user'
				resolve(this.role)
			})
		},
		// Set user's information
		setInfo(partial) {
			this.$patch(partial)
		},

		// Reset user's information
		resetInfo() {
			this.$reset()
		},

		// Get user's information
		async info() {
			const res = await getUserInfo()

			this.setInfo(res.data)
		},

		// Login
		async login(loginForm) {
			try {
				const res = await userLogin(loginForm)
				setToken(res.data.token)
			} catch (err) {
				clearToken()
				throw err
			}
		},
		logoutCallBack() {
			const appStore = useAppStore()
			this.resetInfo()
			clearToken()
			removeRouteListener()
			appStore.clearServerMenu()
		},
		// Logout
		async logout() {
			try {
				await userLogout()
			} finally {
				this.logoutCallBack()
			}
		},
	},
})

export default useUserStore
